package com.ctsi.hsph.spi;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * @author kanlei
 * @version v1.0.0
 * @date 2025-06-04 15:37
 * @Description pingshuo-认证服务SPI接口
 */
@Service
public class SpiService {

    // 默认分页页码
    private static final String DEFAULT_PAGE_NUM = "1";
    // 默认分页大小
    private static final String DEFAULT_PAGE_SIZE = "10";

    @Resource
    SpiAuthUtil spiAuthUtil;


    /**
     * 获取当前登录用户的Token字符串
     *
     * @return 当前登录用户的Token字符串
     */
    public String getTokenStr() {
        return spiAuthUtil.getTokenStr();
    }

    /**
     * 处理分页参数
     * 默认：pageNum=1, pageSize=10，调用者有传以调用者为准
     *
     * @param params 查询参数map（建议支持null）
     * @return 返回包含默认分页参数的新map
     */
    public Map<String, Object> handlePageParam(Map<String, Object> params) {
        Map<String, Object> map = params == null ? new java.util.HashMap<>() : new java.util.HashMap<>(params);
        if (!map.containsKey("pageNum") || map.get("pageNum") == null) {
            map.put("pageNum", DEFAULT_PAGE_NUM);
        }
        if (!map.containsKey("pageSize") || map.get("pageSize") == null) {
            map.put("pageSize", DEFAULT_PAGE_SIZE);
        }
        return map;
    }

    /**
     * 2.1 获取用户列表
     * 请求参数 Map
     *      pageNum  必填 页码，默认1
     *      pageSize 必填 页大小，默认10
     *      username 非必填 用户名
     *      mobile   非必填 手机号
     *      deptCode 非必填 部门编码
     * @param params 查询参数
     * @return 当前登录用户的用户列表信息 json字符串
     */
    public String getUserList(Map<String, Object> params) {
        Map<String, Object> pageMap = handlePageParam(params);
        // 拼接query字符串
        // 2.1 获取用户列表接口
        String USER_LIST_URL = "/spi/user/page";
        StringBuilder sb = new StringBuilder(USER_LIST_URL);
        if (!pageMap.isEmpty()) {
            sb.append("?");
            for (Map.Entry<String, Object> entry : pageMap.entrySet()) {
                sb.append(entry.getKey()).append("=")
                        .append(entry.getValue() != null ? entry.getValue() : "").append("&");
            }
            sb.deleteCharAt(sb.length() - 1); // 去掉最后一个&
        }
        // 发起GET请求
        return spiAuthUtil.getRequest(sb.toString());
    }

    /**
     * 2.2 获取用户详情
     * 请求参数 Map
     *      userId 必填 用户id
     * @param params 查询参数，必须包含 userId
     * @return 用户详情信息 json字符串
     */
    public String getUserDetail(Map<String, Object> params) {
        // 校验必填参数 userId
        if (params == null || !params.containsKey("userId") || params.get("userId") == null) {
            throw new IllegalArgumentException("userId 参数不能为空");
        }
        // 拼接query字符串
        StringBuilder sb = new StringBuilder("/spi/user/details");
        sb.append("?");
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            sb.append(entry.getKey())
                    .append("=")
                    .append(entry.getValue() != null ? entry.getValue() : "")
                    .append("&");
        }
        sb.deleteCharAt(sb.length() - 1); // 去掉最后一个&

        // 发起GET请求
        return spiAuthUtil.getRequest(sb.toString());
    }

    /**
     * 2.3 获取用户绑定的部门列表
     * 请求参数 Map
     *      userId 必填 用户id
     * @param params 查询参数，必须包含 userId
     * @return 用户绑定的部门列表信息 json字符串
     */
    public String getUserDeptList(Map<String, Object> params) {
        // 校验必填参数 userId
        if (params == null || !params.containsKey("userId") || params.get("userId") == null) {
            throw new IllegalArgumentException("userId 参数不能为空");
        }
        // 拼接query字符串
        StringBuilder sb = new StringBuilder("/spi/user/deptList");
        sb.append("?");
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            sb.append(entry.getKey())
                    .append("=")
                    .append(entry.getValue() != null ? entry.getValue() : "")
                    .append("&");
        }
        sb.deleteCharAt(sb.length() - 1); // 去掉最后一个&

        // 发起GET请求
        return spiAuthUtil.getRequest(sb.toString());
    }

    /**
     * 2.4 获取用户绑定的岗位信息
     * 请求参数 Map
     *      userId   必填 用户id
     *      deptCode 必填 部门编码
     * @param params 查询参数，必须包含 userId 和 deptCode
     * @return 用户绑定的岗位信息 json字符串
     */
    public String getUserPostList(Map<String, Object> params) {
        // 校验必填参数 userId 和 deptCode
        if (params == null ||
                !params.containsKey("userId") || params.get("userId") == null ||
                !params.containsKey("deptCode") || params.get("deptCode") == null) {
            throw new IllegalArgumentException("userId 和 deptCode 参数不能为空");
        }
        // 拼接query字符串
        StringBuilder sb = new StringBuilder("/spi/user/postList");
        sb.append("?");
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            sb.append(entry.getKey())
                    .append("=")
                    .append(entry.getValue() != null ? entry.getValue() : "")
                    .append("&");
        }
        sb.deleteCharAt(sb.length() - 1); // 去掉最后一个&

        // 发起GET请求
        return spiAuthUtil.getRequest(sb.toString());
    }

    /**
     * 2.5 获取用户的角色信息
     * 请求参数 Map
     *      userId   必填 用户id
     *      deptCode 必填 部门编码
     * @param params 查询参数，必须包含 userId 和 deptCode
     * @return 用户角色信息 json字符串
     */
    public String getUserRoleList(Map<String, Object> params) {
        // 校验必填参数 userId 和 deptCode
        if (params == null ||
                !params.containsKey("userId") || params.get("userId") == null ||
                !params.containsKey("deptCode") || params.get("deptCode") == null) {
            throw new IllegalArgumentException("userId 和 deptCode 参数不能为空");
        }
        // 拼接query字符串
        StringBuilder sb = new StringBuilder("/spi/user/roleList");
        sb.append("?");
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            sb.append(entry.getKey())
                    .append("=")
                    .append(entry.getValue() != null ? entry.getValue() : "")
                    .append("&");
        }
        sb.deleteCharAt(sb.length() - 1); // 去掉最后一个&

        // 发起GET请求
        return spiAuthUtil.getRequest(sb.toString());
    }

    /**
     * 2.6 获取用户绑定的资源列表
     * 请求参数 Map
     *      userId   必填 用户id
     *      deptCode 必填 部门编码
     * @param params 查询参数，必须包含 userId 和 deptCode
     * @return 用户绑定的资源列表信息 json字符串
     */
    public String getUserResourceList(Map<String, Object> params) {
        // 校验必填参数 userId 和 deptCode
        if (params == null ||
                !params.containsKey("userId") || params.get("userId") == null ||
                !params.containsKey("deptCode") || params.get("deptCode") == null) {
            throw new IllegalArgumentException("userId 和 deptCode 参数不能为空");
        }
        // 拼接query字符串
        StringBuilder sb = new StringBuilder("/spi/user/resourceList");
        sb.append("?");
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            sb.append(entry.getKey())
                    .append("=")
                    .append(entry.getValue() != null ? entry.getValue() : "")
                    .append("&");
        }
        sb.deleteCharAt(sb.length() - 1); // 去掉最后一个&

        // 发起GET请求
        return spiAuthUtil.getRequest(sb.toString());
    }

    /**
     * 3.1 角色列表查询
     * 请求参数 Map
     *      pageNum   必填 分页页数，默认1
     *      pageSize  必填 分页大小，默认10
     *      roleName  非必填 角色名称
     * @param params 查询参数
     * @return 角色列表信息 json字符串
     */
    public String getRoleList(Map<String, Object> params) {
        // 自动补全默认分页参数
        Map<String, Object> pageMap = handlePageParam(params);

        // 拼接query字符串
        StringBuilder sb = new StringBuilder("/spi/role/List");
        if (!pageMap.isEmpty()) {
            sb.append("?");
            for (Map.Entry<String, Object> entry : pageMap.entrySet()) {
                sb.append(entry.getKey())
                        .append("=")
                        .append(entry.getValue() != null ? entry.getValue() : "")
                        .append("&");
            }
            sb.deleteCharAt(sb.length() - 1); // 去掉最后一个&
        }

        // 发起GET请求
        return spiAuthUtil.getRequest(sb.toString());
    }


    /**
     * 3.2 角色绑定用户（用户绑定角色）
     * 请求参数 Map
     *      defaultDeptCode string   非必填 默认部门编码
     *      positions       array    非必填 部门角色岗位结构
     *          - deptCode  string   非必填 部门编号
     *          - isRoot    integer  非必填 1-浙政钉部门；0-授权部门
     *          - postIds   array    非必填 岗位id集合
     *          - roleIds   array    非必填 角色id集合
     *      userId          string   非必填 用户id
     * @param params JSON参数，可参考接口文档示例
     * @return 绑定结果信息 json字符串
     */
    public String allowUserRole(Map<String, Object> params) {
        // 发起POST请求
        return spiAuthUtil.postRequest("/spi/user/allowRole", params);
    }


    /**
     * 3.3 角色绑定资源
     * 请求参数 Map
     *      resourceIds Array  非必填 资源id集合
     *      roleId      int    非必填 角色id
     * @param params JSON参数，可参考接口文档示例
     * @return 绑定结果信息 json字符串
     */
    public String allowRoleResource(Map<String, Object> params) {
        // 发起POST请求
        return spiAuthUtil.postRequest("/spi/role/allowResource", params);
    }

    /**
     * 4.1 用户资源列表
     * 无需请求参数
     * @return 用户资源列表信息 json字符串
     */
    public String getResourceList() {
        // GET请求，无参数
        return spiAuthUtil.getRequest("/spi/resource/list");
    }

    /**
     * 4.2 新增资源
     * 请求参数 Map
     *      name    string  资源名称
     *      pid     int     父级id
     *      code    string  编码
     *      remark  string  备注
     *      status  int     资源状态，1开，0关
     *      type    int     资源类型，0-自有资源，1-外部共享资源
     * @param params JSON参数，可参考接口文档示例
     * @return 新增结果信息 json字符串
     */
    public String addResource(Map<String, Object> params) {
        // 发起POST请求
        return spiAuthUtil.postRequest("/spi/resource/addResource", params);
    }

    /**
     * 4.3 修改资源
     * 请求参数 Map
     *      id      int     主键
     *      name    string  资源名称
     *      pid     int     父级id
     *      code    string  编码
     *      remark  string  备注
     *      status  int     资源状态，1开，0关
     *      type    int     资源类型，0-自有资源，1-外部共享资源
     * @param params JSON参数，可参考接口文档示例
     * @return 修改结果信息 json字符串
     */
    public String editResource(Map<String, Object> params) {
        // 发起POST请求
        return spiAuthUtil.postRequest("/spi/resource/editResource", params);
    }

    /**
     * 4.4 删除资源
     * 请求参数
     *      ids array 必填 主键集合
     * @param ids 资源主键id集合，例如 Arrays.asList(1,2,3)
     * @return 删除结果信息 json字符串
     */
    public String deleteResource(List<Integer> ids) {
        // 发起DELETE请求
        return spiAuthUtil.deleteRequest("/spi/resource/delete", ids);
    }

    /**
     * 4.5 根据条件查询资源列表
     * 请求参数 Map
     *      pid  string  非必填 父级id
     *      name string  非必填 资源名称
     * @param params 查询参数，可参考接口文档示例
     * @return 查询结果信息 json字符串
     */
    public String getInnerResourceList(Map<String, Object> params) {
        // 发起POST请求
        return spiAuthUtil.postRequest("/spi/resource/innerResourceList", params);
    }

    /**
     * 4.6 根据资源Id查询绑定的角色
     * 请求参数 Map
     *      resourceId string 必填 资源id
     * @param params 查询参数，必须包含 resourceId
     * @return 查询结果信息 json字符串
     */
    public String getRoleByResourceId(Map<String, Object> params) {
        // 校验必填参数 resourceId
        if (params == null || !params.containsKey("resourceId") || params.get("resourceId") == null) {
            throw new IllegalArgumentException("resourceId 参数不能为空");
        }
        // 拼接query字符串
        StringBuilder sb = new StringBuilder("/spi/role/getRoleByResourceId");
        sb.append("?");
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            sb.append(entry.getKey())
                    .append("=")
                    .append(entry.getValue() != null ? entry.getValue() : "")
                    .append("&");
        }
        sb.deleteCharAt(sb.length() - 1); // 去掉最后一个&

        // 发起GET请求
        return spiAuthUtil.getRequest(sb.toString());
    }

    /**
     * 5.1 部门列表信息
     * 请求参数 Map
     *      pageNum   必填 分页页数，默认1
     *      pageSize  必填 分页大小，默认10
     * @param params 查询参数
     * @return 部门列表信息 json字符串
     */
    public String getDeptList(Map<String, Object> params) {
        // 自动补全默认分页参数
        Map<String, Object> pageMap = handlePageParam(params);

        // 拼接query字符串
        StringBuilder sb = new StringBuilder("/spi/dept/list");
        if (!pageMap.isEmpty()) {
            sb.append("?");
            for (Map.Entry<String, Object> entry : pageMap.entrySet()) {
                sb.append(entry.getKey())
                        .append("=")
                        .append(entry.getValue() != null ? entry.getValue() : "")
                        .append("&");
            }
            sb.deleteCharAt(sb.length() - 1); // 去掉最后一个&
        }

        // 发起GET请求
        return spiAuthUtil.getRequest(sb.toString());
    }

    /**
     * 5.2 部门详情
     * 请求参数 Map
     *      deptCode string 必填 部门编码
     * @param params 查询参数，必须包含 deptCode
     * @return 部门详情信息 json字符串
     */
    public String getDeptDetail(Map<String, Object> params) {
        // 校验必填参数 deptCode
        if (params == null || !params.containsKey("deptCode") || params.get("deptCode") == null) {
            throw new IllegalArgumentException("deptCode 参数不能为空");
        }
        // 拼接query字符串
        StringBuilder sb = new StringBuilder("/spi/dept/details");
        sb.append("?");
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            sb.append(entry.getKey())
                    .append("=")
                    .append(entry.getValue() != null ? entry.getValue() : "")
                    .append("&");
        }
        sb.deleteCharAt(sb.length() - 1); // 去掉最后一个&

        // 发起GET请求
        return spiAuthUtil.getRequest(sb.toString());
    }

    /**
     * 5.3 根据部门编码查询绑定的用户列表
     * 请求参数 Map
     *      pageNum   必填 分页页数，默认1
     *      pageSize  必填 分页大小，默认10
     *      deptCode  非必填 部门编码
     *      type      非必填 1-全部人员；2-在职人员
     * @param params 查询参数
     * @return 部门下用户列表信息 json字符串
     */
    public String getDeptUserList(Map<String, Object> params) {
        // 自动补全默认分页参数
        Map<String, Object> pageMap = handlePageParam(params);

        // 拼接query字符串
        StringBuilder sb = new StringBuilder("/spi/dept/users/page");
        if (!pageMap.isEmpty()) {
            sb.append("?");
            for (Map.Entry<String, Object> entry : pageMap.entrySet()) {
                sb.append(entry.getKey())
                        .append("=")
                        .append(entry.getValue() != null ? entry.getValue() : "")
                        .append("&");
            }
            sb.deleteCharAt(sb.length() - 1); // 去掉最后一个&
        }

        // 发起GET请求
        return spiAuthUtil.getRequest(sb.toString());
    }

}
